package com.szgz.platform.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.szgz.platform.model.TaskStep;

import java.util.List;

/**
 * 任务步骤服务接口
 */
public interface TaskStepService extends IService<TaskStep> {

    /**
     * 分页查询任务的步骤列表
     *
     * @param page 分页参数
     * @param taskId 任务ID
     * @param status 步骤状态
     * @return 分页结果
     */
    IPage<TaskStep> getStepsByTaskId(Page<TaskStep> page, Long taskId, String status);

    /**
     * 查询任务的所有步骤（树形结构）
     *
     * @param taskId 任务ID
     * @param status 步骤状态
     * @return 步骤列表
     */
    List<TaskStep> getStepsTreeByTaskId(Long taskId, String status);

    /**
     * 创建任务步骤
     *
     * @param taskStep 步骤信息
     * @return 是否成功
     */
    boolean createTaskStep(TaskStep taskStep);

    /**
     * 更新任务步骤
     *
     * @param taskStep 步骤信息
     * @return 是否成功
     */
    boolean updateTaskStep(TaskStep taskStep);

    /**
     * 删除任务步骤
     *
     * @param stepId 步骤ID
     * @return 是否成功
     */
    boolean deleteTaskStep(Long stepId);

    /**
     * 批量删除任务步骤
     *
     * @param stepIds 步骤ID列表
     * @return 是否成功
     */
    boolean batchDeleteTaskSteps(List<Long> stepIds);

    /**
     * 更新步骤顺序
     *
     * @param stepId 步骤ID
     * @param newOrder 新顺序
     * @return 是否成功
     */
    boolean updateStepOrder(Long stepId, Integer newOrder);

    /**
     * 批量更新步骤顺序
     *
     * @param stepOrders 步骤顺序映射（步骤ID -> 新顺序）
     * @return 是否成功
     */
    boolean batchUpdateStepOrders(java.util.Map<Long, Integer> stepOrders);

    /**
     * 查询步骤的子步骤
     *
     * @param parentStepId 父步骤ID
     * @param status 步骤状态
     * @return 子步骤列表
     */
    List<TaskStep> getChildrenByParentId(Long parentStepId, String status);

    /**
     * 查询步骤的父步骤
     *
     * @param stepId 步骤ID
     * @return 父步骤
     */
    TaskStep getParentByStepId(Long stepId);

    /**
     * 查询步骤的依赖步骤
     *
     * @param stepId 步骤ID
     * @return 依赖步骤列表
     */
    List<TaskStep> getDependenciesByStepId(Long stepId);

    /**
     * 查询步骤的依赖步骤
     *
     * @param stepId 步骤ID
     * @return 依赖步骤列表
     */
    List<TaskStep> getDependentsByStepId(Long stepId);

    /**
     * 查询任务中指定类型的步骤
     *
     * @param taskId 任务ID
     * @param stepType 步骤类型
     * @param status 步骤状态
     * @return 步骤列表
     */
    List<TaskStep> getStepsByType(Long taskId, String stepType, String status);

    /**
     * 统计任务的步骤数量
     *
     * @param taskId 任务ID
     * @param status 步骤状态
     * @return 步骤数量
     */
    int countStepsByTaskId(Long taskId, String status);

    /**
     * 查询用户可访问的步骤
     *
     * @param taskId 任务ID
     * @param userId 用户ID
     * @param status 步骤状态
     * @return 步骤列表
     */
    List<TaskStep> getAccessibleSteps(Long taskId, Long userId, String status);

    /**
     * 验证步骤依赖关系
     *
     * @param stepId 步骤ID
     * @return 是否满足依赖条件
     */
    boolean validateStepDependencies(Long stepId);

    /**
     * 复制任务步骤到新任务
     *
     * @param sourceTaskId 源任务ID
     * @param targetTaskId 目标任务ID
     * @return 是否成功
     */
    boolean copyTaskSteps(Long sourceTaskId, Long targetTaskId);

    /**
     * 获取步骤的完整路径
     *
     * @param stepId 步骤ID
     * @return 步骤路径列表（从根到当前步骤）
     */
    List<TaskStep> getStepPath(Long stepId);

    /**
     * 检查步骤是否可见
     *
     * @param stepId 步骤ID
     * @param userId 用户ID
     * @return 是否可见
     */
    boolean isStepVisible(Long stepId, Long userId);

    /**
     * 检查步骤是否可跳过
     *
     * @param stepId 步骤ID
     * @param userId 用户ID
     * @return 是否可跳过
     */
    boolean isStepSkippable(Long stepId, Long userId);
} 